House Price - Análise Exploratória de Dados

1 Objetivos

  • Qual o comportamento da variável resposta ?
  • As proporções e distribuições das variáveis estão equilibradas nos dados de treino e teste ?
  • Quais variáveis estão fortemente correlacionadas ?
  • Qual a métrica usada para verificar a correlação ?
  • Quais variáveis tem maior influência discriminatória sob a variável resposta.
  • Para quais intervalos de determinadas variáveis tenho maior diferença no valor variável resposta ?
  • Faz sentido discretizá-las ?
  • Faz sentido agrupá-las ?
  • Definindo o analytic-base-table (abt)

2 Conjuntos de dados

2.1 Dados de treinamento

df.train <- fread('../outputs/df.train.csv', 
                     sep=",", 
                     showProgress = FALSE)[,-1] %>%
                     data.frame(stringsAsFactors = T) %>% 
                     select(Id,SalePrice,everything())  

3 Transformando o tipo das variáveis

Convertendo as variáveis tipo string em categóricas.

tipo <- lapply(df.train,class)
df.train[,unlist(tipo) != 'integer'] <- data.frame(apply(df.train[,unlist(tipo)!='integer'],2,factor))
df.train

3.1 Dados de teste

df.test <- fread('../outputs/df.test.csv',sep=",", 
                     showProgress = FALSE)[,-1] %>%
                     data.frame(stringsAsFactors = T)

4 Transformando o tipo das variáveis

Convertendo as variáveis tipo string em categóricas.

tipo <- lapply(df.test,class)
df.test[,unlist(tipo) != 'integer'] <- data.frame(apply(df.test[,unlist(tipo)!='integer'],2,factor))
df.test

5 A distribuição da variável resposta.

p0 <- ggdensity(df.train, x = "SalePrice", 
          fill = "#0073C2FF", color = "black",
          add = "mean", rug = TRUE) +
          labs(title = 'Distribuição da densidade da variável SalePrice') +
          theme_dark()

p1 <- ggplot(df.train, aes(x = SalePrice)) + 
      geom_histogram(bins = 100, 
                     color = "black", 
                     fill = "#0073C2FF") +
      labs(title = 'Distribuição de frequência da variável SalePrice') +
      theme_dark() 


gridExtra::grid.arrange(p0,p1,nrow = 1)

Observe que há uma assimetria da distribuição do preço de venda com uma ascentuada cauda a direita. Ou seja, há poucos imóveis com preço muito de alto, o que é de se esperar, assim como há poucos imóveis com preço muito baixos. Essas variações do preço de venda devem estar relacionadas a fatores como:

  • Imóveis de alto padrão
  • Imóveis de médio padrão
  • Imóveis de baixo padrão

E certamente entre as variáveis explicativas encontraremos as que discriminam essas variações.

6 Conjunto de Dados Equilibrados

Para que um modelo construído sobre os dados de treino garanta sua performance sobre os dados de teste, devemos nos preocurar em garantir que em ambos os conjuntos de dados exista um equilíbrio na distribuição e proporção de suas variáveis, caso contrário não há garantia quanto a performance, alías este é um dos grandes equívocos cometidos por muitas empresas.

Garantir que os dados existam dentro de um range faz parte da política data-drive de uma empresa que deseja ter sucesso em seus projetos de analytics.

7 Trabalhando com Dados do Tipo inteiro

df.train_int <- df.train[,unlist(lapply(df.train,is.integer))] %>%
                                        select(-Id,-SalePrice)
df.test_int  <- df.test[,unlist(lapply(df.test,is.integer))] %>% 
                                        select(-Id)

7.1 Teste Kolmogorov Smirnov (KS)

O teste de kolmorov Smirnov, teste KS, é altamente recomendado para testar a hipótese de igualdade entre duas distribuições, pois retorna a distância média, estatística Dn, obtida de cada quantil das distribuições empírica dos dados.

Pensando na produtividades implementei o código abaixo que visa acelerar o processo de testar a igualdade entre as distribuições das variáveis.

7.1.1 Crio a matriz ks.mat

ks.mat <- matrix(NA,ncol = 3,nrow = 0,byrow = T)
colnames(ks.mat) <- c('variavel','dn','p_valor')

7.1.2 Calculo as estatística do teste

for(var in names(df.test_int[,-1])){
  
    # output do test ks
    estat.ks <-  ks.test(df.train_int[,var],df.test_int[,var])
      
    # atribuição da estatistica Dn a variavel d
    d <- as.numeric(unlist(round(estat.ks$statistic,4)))
    # retorna o p-value em p
    pv <- round(estat.ks$p.value,4)
    
    # constrói a tabela ks.mat com as estatísticas obtidas
    ks.mat <- rbind(ks.mat,c(variavel = var,dn = d ,p_valor = pv))

}

considerando os números de linhas de nossas amostras o nível de significância da estatística Dn é dado por.

\[ \dfrac{1.36}{\sqrt{n}} \]

round(1.36/sqrt(nrow(df.train_int)),4)
## [1] 0.0372
round(1.36/sqrt(nrow(df.test_int)),4)
## [1] 0.0374

7.1.3 Construo um dataframe ordenado

data.frame(variavel = as.character(ks.mat[,1]),
           dn = as.numeric(ks.mat[,2]),
           p_valor = as.numeric(ks.mat[,3])) %>%
           arrange(desc(dn))

Esses resultados nos mostram que não há disferença estatística para todas as variáveis considerandos os conjuntos de dados de treino e teste, no entanto, os níveis de significância das variáveis X2ndFlrSF, GrLivArea, TotRmsAbvGrd e LotArea ficaram mais próximos do threshold 0.0374, iremos investigá-las.

7.2 Summary nas variáveis

df.train_int %>% 
  select(X2ndFlrSF,GrLivArea,
        TotRmsAbvGrd,LotArea) %>% 
  summary 
##    X2ndFlrSF        GrLivArea     TotRmsAbvGrd      LotArea      
##  Min.   :   0.0   Min.   : 438   Min.   : 3.00   Min.   :  1300  
##  1st Qu.:   0.0   1st Qu.:1160   1st Qu.: 5.00   1st Qu.:  7744  
##  Median :   0.0   Median :1480   Median : 6.00   Median :  9600  
##  Mean   : 357.1   Mean   :1538   Mean   : 6.55   Mean   : 10706  
##  3rd Qu.: 740.5   3rd Qu.:1792   3rd Qu.: 7.00   3rd Qu.: 11761  
##  Max.   :2065.0   Max.   :5642   Max.   :12.00   Max.   :215245
df.test_int %>% 
  select(X2ndFlrSF,GrLivArea,
        TotRmsAbvGrd,LotArea) %>% 
  summary
##    X2ndFlrSF        GrLivArea     TotRmsAbvGrd       LotArea     
##  Min.   :   0.0   Min.   : 407   Min.   : 3.000   Min.   : 1484  
##  1st Qu.:   0.0   1st Qu.:1142   1st Qu.: 5.000   1st Qu.: 7430  
##  Median :   0.0   Median :1436   Median : 6.000   Median : 9512  
##  Mean   : 330.9   Mean   :1500   Mean   : 6.385   Mean   : 9763  
##  3rd Qu.: 680.0   3rd Qu.:1730   3rd Qu.: 7.000   3rd Qu.:11556  
##  Max.   :1862.0   Max.   :5095   Max.   :15.000   Max.   :51974

Oberve que a variável LotArea no conjunto de treino possui um valor máximo de 215245 enquanto que no conjunto de teste seu valor máximo é 51974, essa variação modificou a posição das medianas nos conjuntos de dados, o que pode implicar em outliers e comprometer a performance do nosso futuro modelo preditivo.

7.2.1 Razão entre máximos

round(max(df.train_int$LotArea)/max(df.test_int$LotArea),2)
## [1] 4.14

7.3 Plot ECDF para LotArea

A distribuição empírica acumulada (ecdf) nos ajuda a visualizar se há diferenças entre duas variáveis, por sorte no nosso caso não há.

ecdfplot(~ df.train_int$LotArea + df.test_int$LotArea, 
           auto.key=list(space='bottom',col = c('red','blue')), 
           col = c('red','blue'), 
           lwd = c(2,3), 
           xlab =" ",ylab = 'F(x)',
           main = 'Distribuição Empírica Acumulada')

Note que variável LotArea na amostra de treinamento tem valores extremos em relação a amostra de teste.

7.4 Boxplot para LotArea

boxplot(df.train_int$LotArea,
        df.test_int$LotArea, 
        main = 'LotArea', 
        xlab = 'treino-teste')

Existem quantos pontos da variável LotArea na amostra de treino são maiores que o ponto máximo na amostra de teste ?

df.train_int$LotArea[df.train_int$LotArea > max(df.test_int$LotArea)]
##  [1] 159000 215245 164660  53107  70761  53227 115149  53504  63887  57200

veja que são apenas 10 linhas em 1338, aproximadamente 0.75%, de modo que podemos remove-las sem comprometer o volume de dados.

7.4.1 Boxplot para o mesmo valor máximo

boxplot(df.train_int$LotArea[df.train_int$LotArea <= max(df.test_int$LotArea)],
        df.test_int$LotArea, 
        main = 'LotArea', 
        xlab = 'treino-teste')

variáveis com distruições equilibradas.

7.5 Boxplots para X2ndFlrSF

par(mfrow=c(1,2))
df.train_int %>% 
  select(X2ndFlrSF) %>% 
  boxplot(main = 'X2ndFlrSF', 
          xlab = 'amostra treino', 
          ylim = c(0,max(df.train_int$X2ndFlrSF)))
df.test_int %>% 
  select(X2ndFlrSF) %>% 
  boxplot(main = 'X2ndFlrSF', 
          xlab = 'amostra teste', 
          ylim = c(0,max(df.train_int$X2ndFlrSF)))

7.6 Boxplots para GrLivArea

par(mfrow=c(1,2))
df.train_int %>% 
  select(GrLivArea) %>% 
  boxplot(main = 'GrLivArea', 
          xlab = 'amostra treino',
          ylim = c(0,max(df.train_int$GrLivArea)))
df.test_int %>% 
  select(GrLivArea) %>% 
  boxplot(main = 'GrLivArea', 
          xlab = 'amostra teste', 
          ylim = c(0,max(df.train_int$GrLivArea)))

7.7 Boxplots para TotRmsAbvGrd

par(mfrow=c(1,2))
df.train_int %>% 
  select(TotRmsAbvGrd) %>% 
  boxplot(main = 'TotRmsAbvGrd', 
          xlab = 'amostra treino',
          ylim = c(0,max(df.train_int$TotRmsAbvGrd)))
df.test_int %>% 
  select(TotRmsAbvGrd) %>% 
  boxplot(main = 'TotRmsAbvGrd', 
          xlab = 'amostra teste',
          ylim = c(0,max(df.train_int$TotRmsAbvGrd)))

7.7.1 Removendo linhas no df.train

Como vimos temos apenas 10 linhas para serem removidas para variável LotAarea no conjunto de treino, ficamos um 1328 linhas em nosso df.train.

df.train <- df.train %>% filter(LotArea <= max(df.test_int$LotArea))

8 Trabalhando com Dados do Tipo Categórico

df.train_fac <- df.train[,unlist(lapply(df.train,is.factor))] 
df.test_fac  <-  df.test[,unlist(lapply(df.test,is.factor))] 

8.1 Analisando a Distribuição das Proporções

Para analisar as proporções das classes em cada variável categórica, criei a função f.prop que me retorna o resumo do comparativo do número de cada classe da variável, suas porcentagens e a diferença percentual que cada classe possui em relação as amostras de treino e teste.

f.prop <- function(fac.train,fac.test,var){

  proptrain <- count(fac.train,eval(parse(text = var))) %>% 
                   arrange(desc(n)) %>%
                   mutate(perc.train = round(100*n/sum(n),2))
  
  names(proptrain) <- c(var,'n.train','perc.train')
  
  proptest <- count(fac.test,eval(parse(text = var))) %>% 
                   arrange(desc(n)) %>%
                   mutate(perc.test = round(100*n/sum(n),2))
  
  names(proptest) <- c(var,'n.test','perc.test')
  
  df.prop <- left_join(proptrain,proptest, by = var)[,c(1,2,4,3,5)] %>%
                            mutate(dif.perc = perc.train-perc.test)
  
  return(df.prop)
}

Somente farei algum comentário caso perceba alguma discrepância nas proporções das classes de alguma variável.

8.1.1 Analise das Vars Categóricas

for(j in 1:5){ 
  
 print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
  
 cat('\n\n')    
 
}  
## # A tibble: 5 x 6
##   MSZoning n.train n.test perc.train perc.test dif.perc
##   <fct>      <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 RL          1056   1031      79.5      78.2     1.35 
## 2 RM           191    205      14.4      15.5    -1.16 
## 3 FV            62     69       4.67      5.23   -0.56 
## 4 RH            11      9       0.83      0.68    0.150
## 5 C (all)        8      5       0.6       0.38    0.220
## 
## 
## # A tibble: 2 x 6
##   Street n.train n.test perc.train perc.test dif.perc
##   <fct>    <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Pave      1324   1315       99.7      99.7        0
## 2 Grvl         4      4        0.3       0.3        0
## 
## 
## # A tibble: 4 x 6
##   LotShape n.train n.test perc.train perc.test dif.perc
##   <fct>      <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Reg          829    820      62.4      62.2     0.25 
## 2 IR1          455    461      34.3      35.0    -0.69 
## 3 IR2           36     33       2.71      2.5     0.210
## 4 IR3            8      5       0.6       0.38    0.220
## 
## 
## # A tibble: 4 x 6
##   LandContour n.train n.test perc.train perc.test dif.perc
##   <fct>         <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Lvl            1206   1184      90.8      89.8     1.05 
## 2 Bnk              50     47       3.77      3.56    0.210
## 3 HLS              46     67       3.46      5.08   -1.62 
## 4 Low              26     21       1.96      1.59    0.370
## 
## 
## # A tibble: 2 x 6
##   Utilities n.train n.test perc.train perc.test dif.perc
##   <chr>       <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 AllPub       1327   1319      99.9        100  -0.0800
## 2 NoSeWa          1     NA       0.08        NA  NA

Veja que no conjunto de teste para a variável Utilities não há a classe NoSeWa e como há apenas uma linhas com essa classe no conjunto de treino, irei remove-lá.

for(j in 6:10){ 
  
 print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
 cat('\n\n')    
 
}
## # A tibble: 5 x 6
##   LotConfig n.train n.test perc.train perc.test dif.perc
##   <fct>       <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Inside        954    977      71.8      74.1     -2.23
## 2 Corner        241    223      18.2      16.9      1.24
## 3 CulDSac        86     77       6.48      5.84     0.64
## 4 FR2            43     33       3.24      2.5      0.74
## 5 FR3             4      9       0.3       0.68    -0.38
## 
## 
## # A tibble: 3 x 6
##   LandSlope n.train n.test perc.train perc.test dif.perc
##   <fct>       <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Gtl          1264   1258      95.2      95.4    -0.200
## 2 Mod            57     58       4.29      4.4    -0.11 
## 3 Sev             7      3       0.53      0.23    0.3  
## 
## 
## # A tibble: 25 x 6
##    Neighborhood n.train n.test perc.train perc.test dif.perc
##    <fct>          <int>  <int>      <dbl>     <dbl>    <dbl>
##  1 NAmes            209    207      15.7      15.7    0.05  
##  2 CollgCr          146    115      11.0       8.72   2.27  
##  3 OldTown          100    103       7.53      7.81  -0.280 
##  4 Somerst           83     87       6.25      6.6   -0.350 
##  5 Gilbert           77     81       5.8       6.14  -0.340 
##  6 NridgHt           75     88       5.65      6.67  -1.02  
##  7 NWAmes            73     58       5.5       4.4    1.10  
##  8 Edwards           69     71       5.2       5.38  -0.180 
##  9 Sawyer            69     70       5.2       5.31  -0.110 
## 10 SawyerW           53     54       3.99      4.09  -0.1000
## # ... with 15 more rows
## 
## 
## # A tibble: 9 x 6
##   Condition1 n.train n.test perc.train perc.test dif.perc
##   <fct>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Norm          1154   1146      86.9      86.9     0.02 
## 2 Feedr           61     66       4.59      5      -0.41 
## 3 Artery          43     34       3.24      2.58    0.66 
## 4 RRAn            26     21       1.96      1.59    0.370
## 5 PosN            19     20       1.43      1.52   -0.09 
## 6 RRAe            10     13       0.75      0.99   -0.24 
## 7 PosA             8     11       0.6       0.83   -0.23 
## 8 RRNn             5      4       0.38      0.3     0.08 
## 9 RRNe             2      4       0.15      0.3    -0.15 
## 
## 
## # A tibble: 8 x 6
##   Condition2 n.train n.test perc.train perc.test dif.perc
##   <chr>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Norm          1314   1305      99.0      98.9      0.01
## 2 Feedr            5      7       0.38      0.53    -0.15
## 3 Artery           2      2       0.15      0.15     0   
## 4 PosN             2      2       0.15      0.15     0   
## 5 RRNn             2     NA       0.15     NA       NA   
## 6 PosA             1      3       0.08      0.23    -0.15
## 7 RRAe             1     NA       0.08     NA       NA   
## 8 RRAn             1     NA       0.08     NA       NA

Classes ausentes no conjunto de dados de teste:

  • Condition2
    • RRNn, RRAe e RRAn
for(j in 11:15){ 
  
 print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
 cat('\n\n')    
 
}
## # A tibble: 5 x 6
##   BldgType n.train n.test perc.train perc.test dif.perc
##   <fct>      <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 1Fam        1129   1109      85.0      84.1    0.940 
## 2 TwnhsE       112    110       8.43      8.34   0.0900
## 3 Twnhs         38     48       2.86      3.64  -0.78  
## 4 Duplex        28     32       2.11      2.43  -0.32  
## 5 2fmCon        21     20       1.58      1.52   0.06  
## 
## 
## # A tibble: 8 x 6
##   HouseStyle n.train n.test perc.train perc.test dif.perc
##   <chr>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 1Story         652    672      49.1      51.0     -1.85
## 2 2Story         423    393      31.8      29.8      2.05
## 3 1.5Fin         132    141       9.94     10.7     -0.75
## 4 SLvl            64     60       4.82      4.55     0.27
## 5 SFoyer          30     39       2.26      2.96    -0.7 
## 6 1.5Unf          11      4       0.83      0.3      0.53
## 7 2.5Unf          10     10       0.75      0.76    -0.01
## 8 2.5Fin           6     NA       0.45     NA       NA   
## 
## 
## # A tibble: 6 x 6
##   RoofStyle n.train n.test perc.train perc.test dif.perc
##   <fct>       <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Gable        1031   1052      77.6      79.8     -2.12
## 2 Hip           269    248      20.3      18.8      1.46
## 3 Flat           10      4       0.75      0.3      0.45
## 4 Gambrel        10     10       0.75      0.76    -0.01
## 5 Mansard         6      3       0.45      0.23     0.22
## 6 Shed            2      2       0.15      0.15     0   
## 
## 
## # A tibble: 7 x 6
##   RoofMatl n.train n.test perc.train perc.test dif.perc
##   <chr>      <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 CompShg     1307   1306      98.4      99.0     -0.59
## 2 Tar&Grv        8      8       0.6       0.61    -0.01
## 3 WdShake        5      4       0.38      0.3      0.08
## 4 WdShngl        5      1       0.38      0.08     0.3 
## 5 Membran        1     NA       0.08     NA       NA   
## 6 Metal          1     NA       0.08     NA       NA   
## 7 Roll           1     NA       0.08     NA       NA   
## 
## 
## # A tibble: 14 x 6
##    Exterior1st n.train n.test perc.train perc.test dif.perc
##    <chr>         <int>  <int>      <dbl>     <dbl>    <dbl>
##  1 VinylSd         486    477      36.6      36.2     0.44 
##  2 HdBoard         210    208      15.8      15.8     0.04 
##  3 MetalSd         201    212      15.1      16.1    -0.930
##  4 Wd Sdng         181    172      13.6      13.0     0.59 
##  5 Plywood          96     99       7.23      7.51   -0.280
##  6 CemntBd          51     57       3.84      4.32   -0.48 
##  7 BrkFace          43     32       3.24      2.43    0.81 
##  8 Stucco           20     14       1.51      1.06    0.450
##  9 WdShing          20     25       1.51      1.9    -0.390
## 10 AsbShng          15     19       1.13      1.44   -0.31 
## 11 Stone             2     NA       0.15     NA      NA    
## 12 BrkComm           1      4       0.08      0.3    -0.220
## 13 CBlock            1     NA       0.08     NA      NA    
## 14 ImStucc           1     NA       0.08     NA      NA

Classes ausentes no conjunto de dados de teste:

  • HouseStyle
    • 2.5Fin, remover 6 linhas
  • RoofMatl
    • Membran, Metal, Roll , remover 3 linhas
  • Exterior1st
    • Stone, CBlock, ImStucc , remover 3 linhas
for(j in 16:20){ 
  
 print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
 cat('\n\n')    
 
}
## # A tibble: 16 x 6
##    Exterior2nd n.train n.test perc.train perc.test dif.perc
##    <chr>         <int>  <int>      <dbl>     <dbl>    <dbl>
##  1 VinylSd         475    474      35.8      35.9    -0.170
##  2 MetalSd         197    215      14.8      16.3    -1.47 
##  3 HdBoard         195    186      14.7      14.1     0.58 
##  4 Wd Sdng         175    167      13.2      12.7     0.520
##  5 Plywood         123    112       9.26      8.49    0.770
##  6 CmentBd          51     58       3.84      4.4    -0.56 
##  7 Wd Shng          31     34       2.33      2.58   -0.25 
##  8 Stucco           22     17       1.66      1.29    0.370
##  9 BrkFace          21     20       1.58      1.52    0.06 
## 10 AsbShng          16     16       1.2       1.21   -0.01 
## 11 ImStucc          10      5       0.75      0.38    0.37 
## 12 Brk Cmn           6     15       0.45      1.14   -0.69 
## 13 AsphShn           2     NA       0.15     NA      NA    
## 14 Stone             2     NA       0.15     NA      NA    
## 15 CBlock            1     NA       0.08     NA      NA    
## 16 Other             1     NA       0.08     NA      NA    
## 
## 
## # A tibble: 4 x 6
##   MasVnrType n.train n.test perc.train perc.test dif.perc
##   <fct>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 None           757    770      57        58.4     -1.38
## 2 BrkFace        431    422      32.4      32.0      0.46
## 3 Stone          126    120       9.49      9.1      0.39
## 4 BrkCmn          14      7       1.05      0.53     0.52
## 
## 
## # A tibble: 4 x 6
##   ExterQual n.train n.test perc.train perc.test dif.perc
##   <fct>       <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 TA            797    789      60.0      59.8     0.2  
## 2 Gd            475    467      35.8      35.4     0.36 
## 3 Ex             49     54       3.69      4.09   -0.400
## 4 Fa              7      9       0.53      0.68   -0.15 
## 
## 
## # A tibble: 4 x 6
##   ExterCond n.train n.test perc.train perc.test dif.perc
##   <chr>       <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 TA           1173   1144      88.3      86.7     1.60 
## 2 Gd            137    140      10.3      10.6    -0.290
## 3 Fa             16     26       1.2       1.97   -0.77 
## 4 Ex              2      8       0.15      0.61   -0.46 
## 
## 
## # A tibble: 5 x 6
##   Foundation n.train n.test perc.train perc.test dif.perc
##   <fct>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 PConc          617    619      46.5      46.9    -0.470
## 2 CBlock         573    551      43.2      41.8     1.38 
## 3 BrkTil         129    144       9.71     10.9    -1.21 
## 4 Stone            6      3       0.45      0.23    0.22 
## 5 Wood             3      2       0.23      0.15    0.08

Classes ausentes no conjunto de dados de teste:

  • Exterior2nd
    • AsphShn, Stone, CBlock, Other
count(df.train_fac,ExterCond)
count(df.test_fac,ExterCond)

Na amostra de teste a classe Po da variável ExterCond não existe na amostra de treino.

for(j in 21:25){ 
  
 print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
 cat('\n\n')    
 
}
## # A tibble: 4 x 6
##   BsmtQual n.train n.test perc.train perc.test dif.perc
##   <fct>      <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 TA           592    585      44.6      44.4     0.230
## 2 Gd           585    561      44.0      42.5     1.52 
## 3 Ex           119    131       8.96      9.93   -0.970
## 4 Fa            32     42       2.41      3.18   -0.77 
## 
## 
## # A tibble: 4 x 6
##   BsmtCond n.train n.test perc.train perc.test dif.perc
##   <fct>      <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 TA          1227   1219      92.4      92.4     -0.03
## 2 Gd            62     53       4.67      4.02     0.65
## 3 Fa            38     46       2.86      3.49    -0.63
## 4 Po             1      1       0.08      0.08     0   
## 
## 
## # A tibble: 4 x 6
##   BsmtExposure n.train n.test perc.train perc.test dif.perc
##   <fct>          <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 No               887    879      66.8      66.6     0.15 
## 2 Av               211    183      15.9      13.9     2.02 
## 3 Gd               119    139       8.96     10.5    -1.58 
## 4 Mn               111    118       8.36      8.95   -0.590
## 
## 
## # A tibble: 6 x 6
##   BsmtFinType1 n.train n.test perc.train perc.test dif.perc
##   <fct>          <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 GLQ              399    414      30.0      31.4    -1.34 
## 2 Unf              392    361      29.5      27.4     2.15 
## 3 ALQ              205    201      15.4      15.2     0.200
## 4 BLQ              139    116      10.5       8.79    1.68 
## 5 Rec              124    149       9.34     11.3    -1.96 
## 6 LwQ               69     78       5.2       5.91   -0.71 
## 
## 
## # A tibble: 6 x 6
##   BsmtFinType2 n.train n.test perc.train perc.test dif.perc
##   <fct>          <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Unf             1169   1143      88.0      86.7     1.37 
## 2 Rec               51     49       3.84      3.71    0.130
## 3 LwQ               46     41       3.46      3.11    0.35 
## 4 BLQ               31     34       2.33      2.58   -0.25 
## 5 ALQ               19     32       1.43      2.43   -1.   
## 6 GLQ               12     20       0.9       1.52   -0.62
for(j in 26:30){ 
  
 print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
 cat('\n\n')    
 
}
## # A tibble: 4 x 6
##   Heating n.train n.test perc.train perc.test dif.perc
##   <chr>     <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 GasA       1309   1311      98.6      99.4    -0.82 
## 2 GasW         15      8       1.13      0.61    0.520
## 3 Grav          3     NA       0.23     NA      NA    
## 4 OthW          1     NA       0.08     NA      NA    
## 
## 
## # A tibble: 5 x 6
##   HeatingQC n.train n.test perc.train perc.test dif.perc
##   <fct>       <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Ex            699    704      52.6      53.4    -0.730
## 2 TA            376    370      28.3      28.0     0.260
## 3 Gd            216    213      16.3      16.2     0.12 
## 4 Fa             36     31       2.71      2.35    0.360
## 5 Po              1      1       0.08      0.08    0    
## 
## 
## # A tibble: 2 x 6
##   CentralAir n.train n.test perc.train perc.test dif.perc
##   <fct>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Y             1267   1265      95.4      95.9      -0.5
## 2 N               61     54       4.59      4.09      0.5
## 
## 
## # A tibble: 5 x 6
##   Electrical n.train n.test perc.train perc.test dif.perc
##   <chr>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 SBrkr         1232   1224      92.8      92.8   -0.03  
## 2 FuseA           76     75       5.72      5.69   0.0300
## 3 FuseF           17     17       1.28      1.29  -0.01  
## 4 FuseP            2      3       0.15      0.23  -0.08  
## 5 Mix              1     NA       0.08     NA     NA     
## 
## 
## # A tibble: 4 x 6
##   KitchenQual n.train n.test perc.train perc.test dif.perc
##   <fct>         <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 TA              647    663      48.7      50.3    -1.55 
## 2 Gd              563    534      42.4      40.5     1.90 
## 3 Ex               95     99       7.15      7.51   -0.360
## 4 Fa               23     23       1.73      1.74   -0.01

Classes ausentes no conjunto de dados de teste:

  • Heating
    • Grav, OthW
  • Electrical
    • Mix
for(j in 31:35){ 
  
 print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
 cat('\n\n')    
 
}
## # A tibble: 7 x 6
##   Functional n.train n.test perc.train perc.test dif.perc
##   <chr>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Typ           1247   1246      93.9      94.5   -0.570 
## 2 Min2            30     27       2.26      2.05   0.210 
## 3 Min1            26     27       1.96      2.05  -0.0900
## 4 Maj1            10      4       0.75      0.3    0.45  
## 5 Mod             10     14       0.75      1.06  -0.31  
## 6 Maj2             4      1       0.3       0.08   0.220 
## 7 Sev              1     NA       0.08     NA     NA     
## 
## 
## # A tibble: 6 x 6
##   GarageType n.train n.test perc.train perc.test dif.perc
##   <fct>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Attchd         844    813      63.6      61.6     1.91 
## 2 Detchd         368    373      27.7      28.3    -0.57 
## 3 BuiltIn         84     96       6.33      7.28   -0.95 
## 4 Basment         19     17       1.43      1.29    0.140
## 5 CarPort          7      5       0.53      0.38    0.15 
## 6 2Types           6     15       0.45      1.14   -0.69 
## 
## 
## # A tibble: 3 x 6
##   GarageFinish n.train n.test perc.train perc.test dif.perc
##   <fct>          <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Unf              577    588       43.4      44.6    -1.13
## 2 RFn              412    377       31.0      28.6     2.44
## 3 Fin              339    354       25.5      26.8    -1.31
## 
## 
## # A tibble: 5 x 6
##   GarageQual n.train n.test perc.train perc.test dif.perc
##   <chr>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 TA            1260   1240      94.9      94.0     0.870
## 2 Fa              48     68       3.61      5.16   -1.55 
## 3 Gd              14     10       1.05      0.76    0.29 
## 4 Ex               3     NA       0.23     NA      NA    
## 5 Po               3      1       0.23      0.08    0.15 
## 
## 
## # A tibble: 5 x 6
##   GarageCond n.train n.test perc.train perc.test dif.perc
##   <fct>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 TA            1277   1276      96.2      96.7   -0.580 
## 2 Fa              33     31       2.48      2.35   0.130 
## 3 Gd               9      5       0.68      0.38   0.3   
## 4 Po               7      6       0.53      0.45   0.08  
## 5 Ex               2      1       0.15      0.08   0.0700

Classes ausentes no conjunto de dados de teste:

  • Functional
    • Sev
  • GarageQual
    • Ex
for(j in 36:38){ 
  
 print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
 cat('\n\n')    
 
}
## # A tibble: 3 x 6
##   PavedDrive n.train n.test perc.train perc.test dif.perc
##   <fct>        <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Y             1248   1217      94.0      92.3      1.71
## 2 N               53     73       3.99      5.53    -1.54
## 3 P               27     29       2.03      2.2     -0.17
## 
## 
## # A tibble: 9 x 6
##   SaleType n.train n.test perc.train perc.test dif.perc
##   <fct>      <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 WD          1149   1142      86.5      86.6   -0.06  
## 2 New          116    106       8.73      8.04   0.69  
## 3 COD           42     39       3.16      2.96   0.2   
## 4 ConLD          6     11       0.45      0.83  -0.380 
## 5 ConLI          4      4       0.3       0.3    0     
## 6 ConLw          4      3       0.3       0.23   0.0700
## 7 CWD            4      8       0.3       0.61  -0.31  
## 8 Con            2      3       0.15      0.23  -0.08  
## 9 Oth            1      3       0.08      0.23  -0.15  
## 
## 
## # A tibble: 6 x 6
##   SaleCondition n.train n.test perc.train perc.test dif.perc
##   <fct>           <int>  <int>      <dbl>     <dbl>    <dbl>
## 1 Normal           1095   1103      82.4      83.6    -1.17 
## 2 Partial           119    109       8.96      8.26    0.7  
## 3 Abnorml            86     70       6.48      5.31    1.17 
## 4 Family             20     25       1.51      1.9    -0.390
## 5 Alloca              7      7       0.53      0.53    0    
## 6 AdjLand             1      5       0.08      0.38   -0.3

8.2 Resumindo as informações obtidas.

Quais as categorias que serão removidas de quais variáveis e amotras ?

  • Condition2
    • RRNn, RRAe e RRAn | df.train
  • HouseStyle
    • 2.5Fin | df.train
  • RoofMatl
    • Membran, Metal, Roll | df.train
  • Exterior1st
    • Stone, CBlock, ImStucc | df.train
  • Exterior2nd
    • AsphShn, Stone, CBlock, Other | df.train
  • ExterCond
    • Po | df.test
  • Heating
    • Grav, OthW | df.train
  • Electrical
    • Mix | df.train
  • Functional
    • Sev | df.train
  • GarageQual
    • Ex | df.train

9 Obtendo um novo df.train

Para remover os níveis das variáveis categóricas precisamos converte-las para o tipo string.

tipo <- lapply(df.train,class)
df.train[,unlist(tipo) != 'integer'] <- 
data.frame(lapply(df.train[,unlist(tipo)!='integer'],function(x) as.character(unlist(x))), stringsAsFactors = F) 

9.1 Filtrando linhas no df.train

df.train <- df.train %>% 
            filter(!(Condition2 %in% c('RRNn','RRAe','RRAn')),
                   !(HouseStyle %in% c('2.5Fin')),
                   !(RoofMatl %in% c('Membran','Metal','Roll')),
                   !(Exterior1st %in% c('Stone','CBlock','ImStucc')),
                   !(Exterior2nd %in% c('AsphShn','Stone','CBlock','Other')),
                   !(Heating %in% c('Grav','OthW')),
                   !(Electrical %in% c('Grav','OthW')),
                   !(Functional %in% c('Sev')),
                   !(GarageQual %in% c('Ex')))
df.train

9.2 Filtrando linhas no df.test

df.test$ExterCond <- as.character(unlist(df.test$ExterCond))
df.test <- df.test %>% filter(ExterCond != 'Po')
df.test

9.3 Exportando os data frames

write.csv(df.train,'../outputs/model.train.csv')
write.csv(df.test,'../outputs/model.test.csv')

Sérgio Carvalho

19 março, 2019